package com.netease.financial.base.share.helper;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;

import com.netease.financial.NfsApplication;
import com.netease.financial.R;
import com.netease.financial.base.share.model.ShareHolder;
import com.netease.financial.common.config.NfsConfig;
import com.netease.financial.common.constant.Constants;
import com.netease.financial.common.util.BitmapUtil;
import com.netease.financial.common.util.ImageUtil;
import com.netease.financial.common.util.ToastUtils;
import com.sina.weibo.sdk.api.ImageObject;
import com.sina.weibo.sdk.api.TextObject;
import com.sina.weibo.sdk.api.WebpageObject;
import com.sina.weibo.sdk.api.WeiboMultiMessage;
import com.sina.weibo.sdk.api.share.IWeiboShareAPI;
import com.sina.weibo.sdk.api.share.SendMultiMessageToWeiboRequest;
import com.sina.weibo.sdk.api.share.WeiboShareSDK;
import com.sina.weibo.sdk.auth.AuthInfo;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.utils.Utility;

/**
 * Created by wyf on 7/1/15.
 */
public class SinaWeiboHelper {

    // 仅分享到客户端
    public static final int SHARE_CLIENT = 1;

    // 存在微博客户端时，分享到微博客户端，否则用url拼接方式分享
    public static final int SHARE_ALL_IN_ONE = 2;
    public static final int mShareType = SHARE_ALL_IN_ONE;
    /** 微博分享的接口实例 */
    private Context mContext;
    private IWeiboShareAPI mWeiboShareAPI;
    private Activity mActivity;

    private SinaWeiboHelper(Context context) {
        mContext = context;
        mActivity = (Activity) context;
        mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(context, NfsConfig.getSinaWeiboAppKey());
        mWeiboShareAPI.registerApp();

        // 获取微博客户端相关信息，如是否安装、支持 SDK 的版本
//        boolean isInstalledWeibo = mWeiboShareAPI.isWeiboAppInstalled();
//        int supportApiLevel = mWeiboShareAPI.getWeiboAppSupportAPI();

    }

    public static SinaWeiboHelper createHelper(Context context) {
        return new SinaWeiboHelper(context);
    }

    public boolean shareOnSinaWeibo(ShareHolder holder) {
        sendMessage(holder, true, true, true, false, false, false);
        return true;
    }

    /**
     * 第三方应用发送请求消息到微博，唤起微博分享界面。
     * @see {@link #sendMultiMessage} 或者 {@link #sendSingleMessage}
     */
    private void sendMessage(ShareHolder holder, boolean hasText, boolean hasImage,
                             boolean hasWebpage, boolean hasMusic, boolean hasVideo, boolean hasVoice) {

        if (mShareType == SHARE_CLIENT) {
            if (mWeiboShareAPI.isWeiboAppSupportAPI()) {
                int supportApi = mWeiboShareAPI.getWeiboAppSupportAPI();
                if (supportApi >= 10351 /*ApiUtils.BUILD_INT_VER_2_2*/) {
                    sendMultiMessage(holder, hasText, hasImage, hasWebpage, hasMusic, hasVideo, hasVoice);
                } else {
                    sendSingleMessage(holder, hasText, hasImage, hasWebpage, hasMusic, hasVideo/*, hasVoice*/);
                }
            } else {
//                Toast.makeText(this, R.string.weibosdk_demo_not_support_api_hint, Toast.LENGTH_SHORT).show();
            }
        }
        else if (mShareType == SHARE_ALL_IN_ONE) {
            sendMultiMessage(holder, hasText, hasImage, hasWebpage, hasMusic, hasVideo, hasVoice);
        }
    }

    /**
     * 第三方应用发送请求消息到微博，唤起微博分享界面。
     * 注意：当 {@link IWeiboShareAPI#getWeiboAppSupportAPI()} >= 10351 时，支持同时分享多条消息，
     * 同时可以分享文本、图片以及其它媒体资源（网页、音乐、视频、声音中的一种）。
     *
     * @param hasText    分享的内容是否有文本
     * @param hasImage   分享的内容是否有图片
     * @param hasWebpage 分享的内容是否有网页
     * @param hasMusic   分享的内容是否有音乐
     * @param hasVideo   分享的内容是否有视频
     * @param hasVoice   分享的内容是否有声音
     */
    private void sendMultiMessage(ShareHolder holder, boolean hasText, boolean hasImage, boolean hasWebpage,
                                  boolean hasMusic, boolean hasVideo, boolean hasVoice) {

        // 1. 初始化微博的分享消息
        WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
        if (hasText) {
            weiboMessage.textObject = getTextObj(holder);
        }
//
        if (hasImage) {
            weiboMessage.imageObject = getImageObj(holder);
        }

        // 用户可以分享其它媒体资源（网页、音乐、视频、声音中的一种）
        if (hasWebpage) {
            weiboMessage.mediaObject = getWebpageObj(holder);
        }
//        if (hasMusic) {
//            weiboMessage.mediaObject = getMusicObj();
//        }
//        if (hasVideo) {
//            weiboMessage.mediaObject = getVideoObj();
//        }
//        if (hasVoice) {
//            weiboMessage.mediaObject = getVoiceObj();
//        }

        // 2. 初始化从第三方到微博的消息请求
        SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
        // 用transaction唯一标识一个请求
        request.transaction = String.valueOf(System.currentTimeMillis());
        request.multiMessage = weiboMessage;

        // 3. 发送请求消息到微博，唤起微博分享界面
        if (mShareType == SHARE_CLIENT) {
            mWeiboShareAPI.sendRequest(mActivity, request);
        }
        else if (mShareType == SHARE_ALL_IN_ONE) {
            AuthInfo authInfo = new AuthInfo(mContext, NfsConfig.getSinaWeiboAppKey(), Constants.REDIRECT_URL, Constants.SCOPE);
            Oauth2AccessToken accessToken = SinaWeiboAccessTokenKeeper.readAccessToken(getApplicationContext());
            String token = "";
            if (accessToken != null) {
                token = accessToken.getToken();
            }
            mWeiboShareAPI.sendRequest(mActivity, request, authInfo, token, new WeiboAuthListener() {

                @Override
                public void onWeiboException( WeiboException arg0 ) {
                }

                @Override
                public void onComplete(Bundle bundle ) {
                    Oauth2AccessToken newToken = Oauth2AccessToken.parseAccessToken(bundle);
                    SinaWeiboAccessTokenKeeper.writeAccessToken(getApplicationContext(), newToken);
                    ToastUtils.showShort(mContext, "onAuthorizeComplete token = " + newToken.getToken());
                }

                @Override
                public void onCancel() {
                }
            });
        }
    }

    /**
     * 第三方应用发送请求消息到微博，唤起微博分享界面。
     * 当{@link IWeiboShareAPI#getWeiboAppSupportAPI()} < 10351 时，只支持分享单条消息，即
     * 文本、图片、网页、音乐、视频中的一种，不支持Voice消息。
     *
     * @param hasText    分享的内容是否有文本
     * @param hasImage   分享的内容是否有图片
     * @param hasWebpage 分享的内容是否有网页
     * @param hasMusic   分享的内容是否有音乐
     * @param hasVideo   分享的内容是否有视频
     */
    private void sendSingleMessage(ShareHolder holder, boolean hasText, boolean hasImage, boolean hasWebpage,
                                   boolean hasMusic, boolean hasVideo/*, boolean hasVoice*/) {

//        // 1. 初始化微博的分享消息
//        // 用户可以分享文本、图片、网页、音乐、视频中的一种
//        WeiboMessage weiboMessage = new WeiboMessage();
//        if (hasText) {
//            weiboMessage.mediaObject = getTextObj();
//        }
//        if (hasImage) {
//            weiboMessage.mediaObject = getImageObj();
//        }
//        if (hasWebpage) {
//            weiboMessage.mediaObject = getWebpageObj();
//        }
//        if (hasMusic) {
//            weiboMessage.mediaObject = getMusicObj();
//        }
//        if (hasVideo) {
//            weiboMessage.mediaObject = getVideoObj();
//        }
//        /*if (hasVoice) {
//            weiboMessage.mediaObject = getVoiceObj();
//        }*/
//
//        // 2. 初始化从第三方到微博的消息请求
//        SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
//        // 用transaction唯一标识一个请求
//        request.transaction = String.valueOf(System.currentTimeMillis());
//        request.message = weiboMessage;
//
//        // 3. 发送请求消息到微博，唤起微博分享界面
//        mWeiboShareAPI.sendRequest(mActivity, request);    // 1. 初始化微博的分享消息
//        // 用户可以分享文本、图片、网页、音乐、视频中的一种
//        WeiboMessage weiboMessage = new WeiboMessage();
//        if (hasText) {
//            weiboMessage.mediaObject = getTextObj();
//        }
//        if (hasImage) {
//            weiboMessage.mediaObject = getImageObj();
//        }
//        if (hasWebpage) {
//            weiboMessage.mediaObject = getWebpageObj();
//        }
//        if (hasMusic) {
//            weiboMessage.mediaObject = getMusicObj();
//        }
//        if (hasVideo) {
//            weiboMessage.mediaObject = getVideoObj();
//        }
//        /*if (hasVoice) {
//            weiboMessage.mediaObject = getVoiceObj();
//        }*/
//
//        // 2. 初始化从第三方到微博的消息请求
//        SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
//        // 用transaction唯一标识一个请求
//        request.transaction = String.valueOf(System.currentTimeMillis());
//        request.message = weiboMessage;
//
//        // 3. 发送请求消息到微博，唤起微博分享界面
//        mWeiboShareAPI.sendRequest(mActivity, request);
    }
//
    /**
     * 创建多媒体（网页）消息对象。
     *
     * @return 多媒体（网页）消息对象。
     */
    private WebpageObject getWebpageObj(ShareHolder holder) {
        WebpageObject mediaObject = new WebpageObject();
        mediaObject.identify = Utility.generateGUID();
        mediaObject.title = holder.title;
        mediaObject.description = holder.description;

        // 设置 Bitmap 类型的图片到视频对象里
        Bitmap thumb = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.mipmap.ic_launcher);
        mediaObject.setThumbImage(thumb);
        mediaObject.actionUrl = holder.webUrl;
        mediaObject.defaultText = "Webpage 默认文案";
        return mediaObject;
    }


    private Context getApplicationContext() {
        return NfsApplication.getApplication().getApplicationContext();
    }

    /**
     * 创建文本消息对象。
     *
     * @return 文本消息对象。
     */
    private TextObject getTextObj(ShareHolder holder) {
        TextObject textObject = new TextObject();
        textObject.text = holder.title + holder.description;
        return textObject;
    }
//
    /**
     * 创建图片消息对象。
     *
     * @return 图片消息对象。
     */
    private ImageObject getImageObj(ShareHolder holder) {
        ImageObject imageObject = new ImageObject();
        imageObject.setImageObject(getThumbnail(holder.imageUrl));
        return imageObject;
    }

    private Bitmap getThumbnail(String imageUrl) {
        Bitmap thumb = ImageUtil.getThumbnail(imageUrl);
        if (thumb == null) {
            thumb = BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_launcher);
        }
        return BitmapUtil.cropCenterBitmap(thumb, 120, 120);
    }
//
//    /**
//     * 创建多媒体（音乐）消息对象。
//     *
//     * @return 多媒体（音乐）消息对象。
//     */
//    private MusicObject getMusicObj() {
//        // 创建媒体消息
//        MusicObject musicObject = new MusicObject();
//        musicObject.identify = Utility.generateGUID();
//        musicObject.title = mShareMusicView.getTitle();
//        musicObject.description = mShareMusicView.getShareDesc();
//
//        // 设置 Bitmap 类型的图片到视频对象里
//        musicObject.setThumbImage(mShareMusicView.getThumbBitmap());
//        musicObject.actionUrl = mShareMusicView.getShareUrl();
//        musicObject.dataUrl = "www.weibo.com";
//        musicObject.dataHdUrl = "www.weibo.com";
//        musicObject.duration = 10;
//        musicObject.defaultText = "Music 默认文案";
//        return musicObject;
//    }
//
//    /**
//     * 创建多媒体（视频）消息对象。
//     *
//     * @return 多媒体（视频）消息对象。
//     */
//    private VideoObject getVideoObj() {
//        // 创建媒体消息
//        VideoObject videoObject = new VideoObject();
//        videoObject.identify = Utility.generateGUID();
//        videoObject.title = mShareVideoView.getTitle();
//        videoObject.description = mShareVideoView.getShareDesc();
//
//        // 设置 Bitmap 类型的图片到视频对象里
//        videoObject.setThumbImage(mShareVideoView.getThumbBitmap());
//        videoObject.actionUrl = mShareVideoView.getShareUrl();
//        videoObject.dataUrl = "www.weibo.com";
//        videoObject.dataHdUrl = "www.weibo.com";
//        videoObject.duration = 10;
//        videoObject.defaultText = "Vedio 默认文案";
//        return videoObject;
//    }
//
//    /**
//     * 创建多媒体（音频）消息对象。
//     *
//     * @return 多媒体（音乐）消息对象。
//     */
//    private VoiceObject getVoiceObj(ShareHolder holder) {
//        // 创建媒体消息
//        VoiceObject voiceObject = new VoiceObject();
//        voiceObject.identify = Utility.generateGUID();
//        voiceObject.title = mShareVoiceView.getTitle();
//        voiceObject.description = mShareVoiceView.getShareDesc();
//
//        // 设置 Bitmap 类型的图片到视频对象里
//        voiceObject.setThumbImage(mShareVoiceView.getThumbBitmap());
//        voiceObject.actionUrl = mShareVoiceView.getShareUrl();
//        voiceObject.dataUrl = "www.weibo.com";
//        voiceObject.dataHdUrl = "www.weibo.com";
//        voiceObject.duration = 10;
//        voiceObject.defaultText = "Voice 默认文案";
//        return voiceObject;
//    }
}
